package com.qianfeng.microservice.filter;


//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼            BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  


import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.jmnarloch.spring.cloud.ribbon.support.RibbonFilterContextHolder;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

/**
 * Created by jackiechan on 2022/10/21 09:28
 *
 * @author jackiechan
 * @version 1.0
 * @since 1.0
 */
@Component
public class MyPreFilter1 extends ZuulFilter {
    /**
     * 声明过滤器的类型,前置,后置还是错误之类的
     *
     * @return
     */
    @Override
    public String filterType() {
//        return "pre";
        return FilterConstants.PRE_TYPE;
    }

    /**
     * 过滤器的顺序,数字越小,优先级越高,仅限于相同类型的过滤器
     *
     * @return
     */
    @Override
    public int filterOrder() {
        return FilterConstants.PRE_DECORATION_FILTER_ORDER + 1;//我们的前置过滤器的优先级至少要比系统内置的这个过滤器加1,避免我们在内部进行强制转转发服务的过程中出现空指针
    }

    /**
     * 是否启用当前过滤器
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器要执行的代码
     *
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        System.err.println("MyPreFilter1中的方法run 执行了--->");
        //前置过滤器可以干什么, 可以获取到请求对象,可以获取响应对象
        //可以拦截请求,返回其他数据
        //1 获取请求和响应对象
        //获取到请求的上下文对象
        RequestContext requestContext = RequestContext.getCurrentContext();
//        HttpServletRequest request = requestContext.getRequest();
//        String method = request.getParameter("method");
//        HttpServletResponse response = requestContext.getResponse();
        //拦截请求
        // requestContext.setSendZuulResponse(false);
        //返回数据
//        HttpServletResponse response = requestContext.getResponse();
//        try {
//            response.setContentType("text/html;charset=utf-8");
//            response.getWriter().write("震惊,今天是周五,昨天居然是周四!!");
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
        //设置响应正文,不管有没有拦截请求,都会返回这个数据,有原始结果的情况下会覆盖原始结果
        //requestContext.setResponseBody("zhe shi fan hui de neirong");
        requestContext.set("name", "axiba");
        //addressinfo-->addressprovidereureka04,/address/info/100
        //强制转发服务,转发到指定名字的指定地址
//        requestContext.set(FilterConstants.SERVICE_ID_KEY, "addressprovidereureka04");
//        requestContext.set(FilterConstants.REQUEST_URI_KEY,"/address/info/100");
        //转发到服务标识是a的那个服务,我们唯一要做的就是根据我们自己的灰度发布的规则来判断当前请求的标识应该是什么
        //比如我们定义山东的用户可以访问a版本,其他地区的用户只能访问1版本,这里需要做的事情就是判断是不是山东的用户
        // 假设我们通过location来确定用户的位置
        String location = requestContext.getRequest().getParameter("location");
        if ("shandong".equals(location)) {
            RibbonFilterContextHolder.getCurrentContext().add("forward", "a");
        }else{
            RibbonFilterContextHolder.getCurrentContext().add("forward", "1");
        }
        return null;
    }
}
